package proyectoFC_2_3_3.koyicabuto.services;

import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import proyectoFC_2_3_3.koyicabuto.ListaGruposActivity;
import proyectoFC_2_3_3.koyicabuto.BaseDeDatos.GruposDataBase;
import proyectoFC_2_3_3.koyicabuto.funciones.Funciones;
import proyectoFC_2_3_3.koyicabuto.funciones.FuncionesBaseDatos;
import proyectoFC_2_3_3.koyicabuto.funciones.FuncionesWebService;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Binder;
import android.os.IBinder;

/**
 * Clase en la que cada cierto tiempo marcado por la constante UPDATE_INTERVAL, enviamos al webService nuestra posicion actual.S
 * @author jmartin
 *
 */
public class MyNotificationService extends Service {
	
	private Timer timer = new Timer();
	private static final long UPDATE_INTERVAL = 600000;
	
	private final IBinder mBinder = new MyBinder();
	
	private final String ns = Context.NOTIFICATION_SERVICE;
	private NotificationManager notManager;
	private Notification notification;
	
	private FuncionesBaseDatos  funcionesBaseDatos  = new FuncionesBaseDatos();
	private FuncionesWebService funcionesWebService = new FuncionesWebService();
	private Funciones funciones = new Funciones();
	private SQLiteDatabase gruposDataBase = null;
	
	private String datosNuevoEvento = null;
	
	private String nombreEvento = null;
	private String descripcionEvento = null;
	private Long idGrupo = null;
	
	private static final int NOTIFICACION_ALERTA_ID = 1;
 
	public void onCreate() {
		super.onCreate();
		
		//Obtenemos una referencia al servicio de notificaciones
		notManager = (NotificationManager) getSystemService(ns);
		
		pollForUpdates();
	}
	
	public void crearNotificacion(String titulo, String descripcion, Long idGrupo){
		//Configuramos la notificacion
		int icono = android.R.drawable.stat_sys_warning;
		CharSequence textoEstado = "¡Nuevo Evento!";
		long horaNotificacion = System.currentTimeMillis();
		
		descripcion = "Grupo Compis Universidad";
		
		notification = new Notification(icono, textoEstado, horaNotificacion);
		
		//Configuramos el Intent
		Context contexto = getApplicationContext();
		 
		Intent notificationIntent = new Intent(getApplicationContext(), ListaGruposActivity.class);
		 
		PendingIntent pendingIntent = PendingIntent.getActivity(contexto, 0, notificationIntent, 0);
		 
		notification.setLatestEventInfo(contexto, titulo, descripcion, pendingIntent);
		
		//Cuando pulsemos sobre la notificacion esta desaparece de la barra de estado
		notification.flags |=  Notification.FLAG_AUTO_CANCEL;
		
		//Enviar notificación
		notManager.notify(NOTIFICACION_ALERTA_ID, notification);
		
		System.out.println("RUN MyNotificationService");
	}
 
	private void pollForUpdates() {
		timer.scheduleAtFixedRate(new TimerTask() {
			@Override
			public void run() {
				
				if(!exiteEvento("Festival de las Naciones")){
					conectaWebService();
					actualizaEventoBBDD();
					crearNotificacion(nombreEvento, descripcionEvento, idGrupo);
				}
			}
		}, 0, UPDATE_INTERVAL);
	}
 
	@Override
	public void onDestroy() {
		super.onDestroy();
		
		if (timer != null) {
			timer.cancel();
		}
	}
 
	@Override
	public IBinder onBind(Intent arg0) {
		return mBinder;
	}
 
	public class MyBinder extends Binder {
		public MyNotificationService getService() {
			return MyNotificationService.this;
		}
	}
	
	public void conectaWebService(){        
        //Conectamos con el WebService y recibimos las coordenadas
        datosNuevoEvento = funcionesWebService.conectaMetodoWebService("notificacionesNuevosEventos", null);
	}
	
	private void actualizaEventoBBDD(){
		
		List<Object[]> listaCoordenadas = funciones.trataEventos(datosNuevoEvento);
		String nombre = null;
		Double longitud = null;
		Double latitud = null;
		String descripcion = null;
		String numeroCreador = null;
		Long idGrupo = null;
		String insertNuevoEventos = null;
		
		gruposDataBase = funcionesBaseDatos.conectaWritableBaseDeDatos(this);
		
		if(gruposDataBase != null){
	
			for(Object[] array:listaCoordenadas){
				nombre = (String)array[0];
				longitud = (Double)array[1];
				latitud = (Double)array[2];
				idGrupo = (Long)array[3];
				numeroCreador = (String)array[4];
				descripcion = (String)array[5];
				
				this.descripcionEvento = descripcion;
				this.nombreEvento = nombre;
				this.idGrupo = idGrupo;
								
				Long idCreador = funciones.obtenerIdContactoCreadorEvento(numeroCreador, this);
				
				insertNuevoEventos = "INSERT INTO EVENTOS (ev_nombre, ev_longitud, ev_latitud, ev_gr_id,  ev_creador_id,  ev_descripcion) " +
									 "VALUES('" + nombre + "', " + longitud +", " + latitud + ", " + idGrupo + ", " + idCreador + ", " + 
									 "'" + descripcion + "' )";
				
				gruposDataBase.execSQL(insertNuevoEventos);
			}
			funcionesBaseDatos.cierraBaseDeDatos(gruposDataBase);
			
			System.out.println("Coordenadas actualizadas en BB.DD.");
		}
	}
	
	private boolean exiteEvento(String nombreEvento){
		boolean existe = false;
		int contador = 0;
		String selectGrupo = "SELECT COUNT(*) FROM EVENTOS WHERE EV_NOMBRE = ? ";
		String[] parametros = new String[]{nombreEvento};
  	  
		GruposDataBase  gruposDataBaseHelper = new GruposDataBase(this, "GruposDataBase", null, 1);
		SQLiteDatabase gruposDataBase = gruposDataBaseHelper.getReadableDatabase();	
		  
		try{
			if(gruposDataBase != null){
				Cursor cursor = gruposDataBase.rawQuery(selectGrupo, parametros);
				if(cursor.moveToFirst()){
					do{
						contador = cursor.getInt(0);
					}while(cursor.moveToNext());
				}
				gruposDataBaseHelper.close();
				gruposDataBase.close();
				
				if(contador > 0){
					existe = true;
				}
			}			
			
		}catch (Exception e) {
			System.out.println("Excepcion en exiteEvento: " + e.getMessage());
		}
		
		return existe;
	}
}